/**
 * var缺点：
 * 1、变量污染（利用立即执行函数解决）
 */

/**
 * let 块级作用域 {}
 * 1、不能在同一作用域重复声明
 * 2、let不会提升，会产生一个暂时性死区
 * 3、只能在当前的作用域下生效
 */

// let在同一作用域下重复声明
// function test(a){ // 报错
function test(){
    let a = 1;
    // let a = 2; // 报错
    // var a = 2; // 报错
}

test();

function test1(a){
    {
        let a = 10;
        console.log(a);
    }
    console.log(a);
}
test1();

console.log('-----分割线-----');

// let不会提升，会产生一个暂时性死区
// console.log(b); // 报错
// let b = 10;

// function test2(){
//     console.log(b); // 报错
//     let b = 10;
// }

// test2();

// 练习1
// var a = a;
// console.log(a);

// let b = b;
// console.log(b);

// 练习2
// function test3(x = y, y = 2){
//     console.log(x, y); // 报错
// }

// test3()

// console.log(typeof(c)); // 报错
// let c;

console.log('-----分割线-----');

// for(let i = 0; i < 10; i++){}
// console.log(i); // 报错


var practice3 = (function(){
    // 练习1
    var arr = [];
    for(var i = 0; i < 10; i++){
        arr[i] = function(){
            console.log(i);
        }
    }

    for(var i = 0; i < 10; i++){
        arr[i]();
    }
})();

var practice4 = (function(){
    // 考1
    // for(var i = 0; i < 10; i++){
    //     i = 'a';
    //     console.log(i);
    // }
    // 考2
    // for(var i = 0; i < 10; i++){
    //     var i = 'a'; // 会被覆盖
    //     console.log(i);
    // }
    // 考3
    // for(let i = 0; i < 10; i++){
    //     i = 'a';
    //     console.log(i);
    // }
    // 考4
    // for(let i = 0; i < 10; i++){
    //     var i = 'a'; // 会提升
    //     console.log(i);
    // }
    // 考5
    for(let i = 0; i < 10; i++){
        let i = 'a';
        console.log(i);
    }
})();

var practice5 = (function(){
    console.log('----分割线----');
    var arr = [];
    for(let i = 0; i < 10; i++){
        arr[i] = function(){
            console.log(i);
        }
    }
    
    for(var a = 0; a < arr.length; a++){
        arr[a]();
    }
    console.log('----分割线----');
    var arr1 = [];
    for(var j = 0; j < 10; j++){
        arr1[j] = function(){
            console.log(j);
        }
    }
    
    for(var k = 0; k < arr1.length; k++){
        arr1[k]();
    }
})();

var initParam = function(){
    practice3,
    practice4,
    practice5
}

initParam()